﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Transactions;

namespace QuanLyHocPhi.BLL
{
    using Model;
    using QuanLyHocPhi.GUI;

    partial class BizSinhVien
    {
        #region Danh sách cột của DataTable dùng để import dữ liệu
        //public const string Col_Checked = "Checked";
        public const string Col_TrangThai = "TrangThai";
        public const string Col_MaSinhVien = "MASV";
        public const string Col_HoDem = "HO";
        public const string Col_Ten = "TEN";
        public const string Col_Lop = "LOP";
        public const string Col_HocPhi = "HOCPHI";
        public const string Col_PhuPhi = "PHUPHI";
        public const string Col_NTS = "NAMTS";
        public const string Col_HDT = "HE";
        public const string Col_DoiTuong = "DOITUONG";
        public const string Col_Dien = "DIEN";
        public const string Col_Giam = "GIAM";
        public const string Col_GhiChu = "GHICHU";

        public const string Col_NopLan1 = "LAN1";
        public const string Col_NgayNopLan1 = "NGAYNOPLAN1";
        public const string Col_SoPhieuLan1 = "SOPHIEULAN1";

        public const string Col_NopLan2 = "LAN2";
        public const string Col_NgayNopLan2 = "NGAYNOPLAN2";
        public const string Col_SoPhieuLan2 = "SOPHIEULAN2";

        public const string Col_NopLan3 = "LAN3";
        public const string Col_NgayNopLan3 = "NGAYNOPLAN3";
        public const string Col_SoPhieuLan3 = "SOPHIEULAN3";

        public const string Col_ImportThanhCong = "ImportThanhCong";
        #endregion

        #region Trạng thái của 1 dòng dữ liệu trong quá trình tiền xử lý trước khi import
        public static class ImportStatus
        {
            public const string IN_OK = "sẵn sàng";
            public const string IN_ERROR = "lỗi";
            public const string IN_ERROR_HOCPHI = "lỗi: học phí";
            public const string IN_ERROR_LOP_EMPTY = "lỗi: thiếu tên lớp";
            public const string IN_ERROR_NOT_ENOUGH = "lỗi: dữ liệu không đầy đủ";
            public const string IN_ERROR_NTS = "lỗi: năm tuyển sinh không đúng";
            public const string IN_ERROR_HDT_EMPTY = "lỗi: hệ đào tạo rỗng";
            public const string IN_ERROR_HDT_NOTEXIST = "lỗi: hệ đào tạo không tồn tại";
            public const string OUT_OK = "đã nạp";
            public const string OUT_UPDATED = "đã cập nhật";
            public const string OUT_ERROR_GENERAL = "lỗi: không nạp được";
            public const string OUT_ERROR_ALREADY_EXIST = "đã tồn tại";
            public const string IN_ERROR_PT = "lỗi: dữ liệu phiếu thu không đúng";
        }

        #endregion

        #region WriteLog
        private static void WriteLog(System.IO.StreamWriter sw, string log)
        {
            if (sw == null)
                return;
            sw.WriteLine(log);
        }

        private static void WriteLog(System.IO.StreamWriter sw, string logFormat, params object[] args)
        {
            WriteLog(sw, string.Format(logFormat, args));
        }
        #endregion

        internal static int NapDuLieuSinhVien(NamHoc namNopHocPhi, DataTable dt, string logFilePath = null)
        {
            int nInsertedSinhVien = 0;
            int soPhieuTrongQuyen = 50;
            if (dt.Columns.Contains(Col_ImportThanhCong) == false)
                dt.Columns.Add(Col_ImportThanhCong, typeof(bool));
            using (var context = new QLHPEntities())
            {
                #region System.IO.StreamWriter sr = mở file log nếu được
                System.IO.StreamWriter sw = null;
                if (logFilePath != null)
                    try
                    {
                        sw = new System.IO.StreamWriter(logFilePath);
                    }
                    catch
                    {
                        logFilePath = null;
                    }
                #endregion

                try
                {
                    string st = string.Format("{0} - Nạp dữ liệu sinh viên",
                         DateTime.Now.ToString("dd/MM/yyyy hh:mmLss"));
                    WriteLog(sw, st);
                    WriteLog(sw, StringUtils.TạoChuỗi('-', st.Length));

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Console.WriteLine("Dong thu: " + i);
                        DataRow row = dt.Rows[i];
                        var trangThai = Convert.ToString(row[Col_TrangThai]);
                        if (trangThai.Equals(ImportStatus.IN_OK) == false)
                            continue;
                        if (trangThai.Equals(ImportStatus.OUT_OK))
                            continue;

                        trangThai = "";

                        #region Năm tuyển sinh

                        string namTuyenSinh = Convert.ToString(row[Col_NTS]);// maSinhVien.Substring(0, 2);
                        int ntsTemp = 0;
                        if (!int.TryParse(namTuyenSinh, out ntsTemp))
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_NTS;
                            continue;
                        }
                        #endregion

                        #region Hệ đào tạo

                        string heDaoTao = Convert.ToString(row[Col_HDT]);// maSinhVien.Substring(0, 2);
                        if (string.IsNullOrEmpty(heDaoTao))
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_HDT_EMPTY;
                            continue;
                        }
                        var loaiHinh = context.LoaiHinhDaoTaoDbSet.Where(e => e.MaLoaiHinh == heDaoTao).FirstOrDefault();
                        if (loaiHinh == null)
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_HDT_NOTEXIST;
                            continue;
                        }
                        heDaoTao = heDaoTao.Trim();
                        #endregion

                        #region 01. Tạo lớp gốc
                        var tenLopGoc = Convert.ToString(row[Col_Lop]);
                        if (!string.IsNullOrEmpty(tenLopGoc))
                            tenLopGoc = tenLopGoc.Trim();
                        else
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_LOP_EMPTY;
                            Console.WriteLine("- Ten lop rong");
                            continue;
                        }
                        WriteLog(sw, "01. Tạo lớp gốc ", DateTime.Now.ToString("dd/MM/yyyy hh:mmLss"));
                        var oLopGoc = context.LopGocDbSet
                            .Where(e => e.TenLopGoc == tenLopGoc)
                            .FirstOrDefault();
                        if (oLopGoc == null)
                        {
                            // Lớp gốc chưa tồn tại → Tạo lớp gốc
                            oLopGoc = new LopGoc
                            {
                                MaLopGoc = Guid.NewGuid().ToString(),
                                TenLopGoc = tenLopGoc,
                                NamTuyenSinh = namTuyenSinh,
                                MaLoaiHinhDaoTao = loaiHinh.MaLoaiHinh
                            };
                            try
                            {
                                context.LopGocDbSet.Add(oLopGoc);
                                context.SaveChanges();
                                WriteLog(sw, "+LopGoc+{0}\tTạo lớp gốc {1}", oLopGoc.MaLopGoc, tenLopGoc);
                                trangThai = ImportStatus.OUT_OK;
                            }
                            catch (Exception exc)
                            {
                                string msg = string.Format("\tLỗi khi tạo lớp gốc {0}: {1}", tenLopGoc, exc.Message);
                                WriteLog(sw, msg);
                                //throw new Exception(msg, exc);
                            }
                            Console.WriteLine("- Tao moi lop: " + oLopGoc.TenLopGoc);
                        }
                        else
                        {
                            if (oLopGoc.NamTuyenSinh != namTuyenSinh || oLopGoc.MaLoaiHinhDaoTao != loaiHinh.MaLoaiHinh)
                            {
                                oLopGoc.NamTuyenSinh = namTuyenSinh;
                                oLopGoc.MaLoaiHinhDaoTao = loaiHinh.MaLoaiHinh;
                                context.SaveChanges();
                                trangThai = ImportStatus.OUT_UPDATED + " lớp;";
                                Console.WriteLine("- Cap nhat lop: " + oLopGoc.TenLopGoc);
                            }
                        }
                        #endregion

                        #region string masinhvien
                        string maSinhVien = Convert.ToString(row[Col_MaSinhVien]);
                        maSinhVien = maSinhVien.IsNullOrEmpty() ? "" : maSinhVien.Trim();
                        #endregion

                        #region string ho
                        string hoDem = Convert.ToString(row[Col_HoDem]);
                        hoDem = hoDem.Trim();
                        #endregion

                        #region string ten;
                        string ten = "";
                        try
                        {
                            ten = Convert.ToString(row[Col_Ten]);
                            ten = ten.Trim();
                        }
                        catch { ten = ""; }
                        #endregion

                        #region string đối tượng;
                        string doituong = "";
                        try
                        {
                            doituong = Convert.ToString(row[Col_DoiTuong]);
                            doituong = doituong.Trim();
                        }
                        catch { doituong = ""; }
                        #endregion

                        #region string dien;
                        string dien = "";
                        try
                        {
                            dien = Convert.ToString(row[Col_Dien]);
                            dien = dien.Trim();
                        }
                        catch
                        {
                            dien = "";
                        }
                        #endregion

                        #region double giảm;
                        double giam = 0;
                        try
                        {
                            giam = Convert.ToDouble(row[Col_Giam]);
                        }
                        catch
                        {
                            var giamStr = row[Col_Giam].ToString();
                            double rs = 0;
                            if (!string.IsNullOrEmpty(giamStr))
                            {
                                giamStr = giamStr.Replace("%", "").Trim();
                                if (double.TryParse(giamStr, out rs))
                                {
                                    giam = double.Parse(giamStr);
                                    giam = giam / 100;
                                }
                                else
                                    giam = 0;
                            }
                            else
                                giam = 0;
                        }
                        #endregion

                        #region string ghichu;
                        string ghiChu = "";
                        try
                        {
                            ghiChu = Convert.ToString(row[Col_GhiChu]);
                            ghiChu = ghiChu.Trim();
                        }
                        catch { ghiChu = ""; }
                        #endregion

                        #region Nạp sinh viên vào hệ thống
                        string maLopGoc = oLopGoc.MaLopGoc;
                        SinhVien oSinhVien = null;
                        if (string.IsNullOrEmpty(maSinhVien))
                        {
                            oSinhVien = context.SinhVienDbSet.Where(e => e.HoDem == hoDem && e.Ten == ten && e.MaLopGoc == oLopGoc.MaLopGoc).FirstOrDefault();
                            if (oSinhVien == null)
                            {
                                #region Nạp sinh viên vào hệ thống
                                int def = 0;
                                var genID = "";
                                do
                                {
                                    def++;
                                    genID = GenerateIDHocVien(context, int.Parse(namTuyenSinh), "Y", def);
                                    oSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == genID).FirstOrDefault();
                                } while (oSinhVien != null);
                                oSinhVien = new SinhVien
                                {
                                    MaSinhVien = genID,
                                    HoDem = hoDem,
                                    Ten = ten,
                                    DoiTuong = doituong,
                                    Dien = dien,
                                    Giam = (decimal)giam,
                                    MaLopGoc = oLopGoc.MaLopGoc,
                                    GhiChu = ghiChu
                                };
                                #region try to add oSinhVien
                                try
                                {
                                    context.SinhVienDbSet.Add(oSinhVien);
                                    context.SaveChanges();
                                    WriteLog(sw, "+SinhVien+{0}\tTạo record sinh viên {0} {1} {2}",
                                        maSinhVien, hoDem, ten);
                                    row[Col_TrangThai] = ImportStatus.OUT_OK;
                                    nInsertedSinhVien++;
                                }
                                catch (Exception exc)
                                {
                                    string msg = string.Format("\tLỗi khi tạo record sinh viên {0}-{1}: {2}", maSinhVien, hoDem + " " + ten, exc.Message);
                                    WriteLog(sw, msg);
                                    //throw new Exception(msg, exc);
                                    row[Col_TrangThai] = ImportStatus.OUT_ERROR_GENERAL;
                                    continue;
                                }
                                #endregion
                                #endregion
                                Console.WriteLine(string.Format("- Them moi thong tin sinh vien: {0} - {1} {2}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                    oSinhVien.Ten));
                                WriteLog(sw, string.Format("- Them moi thong tin sinh vien: {0} - {1} {2}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                    oSinhVien.Ten));
                            }
                            else
                            {
                                if ((oSinhVien.Dien != dien) || (oSinhVien.DoiTuong != doituong) || (oSinhVien.Giam != (decimal)giam) || (oSinhVien.GhiChu != ghiChu))
                                {
                                    oSinhVien.Dien = dien;
                                    oSinhVien.DoiTuong = doituong;
                                    oSinhVien.Giam = (decimal)giam;
                                    oSinhVien.GhiChu = ghiChu;
                                    context.SaveChanges();
                                    trangThai = ImportStatus.OUT_UPDATED + " sinh viên";
                                    Console.WriteLine(string.Format("- Cap nhat thong tin sinh vien: {0} - {1} {2} {3} {4} {5}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                        oSinhVien.Ten, oSinhVien.Dien, oSinhVien.DoiTuong, oSinhVien.GhiChu));
                                    WriteLog(sw, string.Format("- Cap nhat thong tin sinh vien: {0} - {1} {2} {3} {4} {5}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                        oSinhVien.Ten, oSinhVien.Dien, oSinhVien.DoiTuong, oSinhVien.GhiChu));
                                }
                            }
                        }
                        else
                        {
                            oSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == maSinhVien).FirstOrDefault();
                            if (oSinhVien == null)
                            {
                                #region Nạp sinh viên vào hệ thống
                                oSinhVien = new SinhVien
                                {
                                    MaSinhVien = maSinhVien,
                                    HoDem = hoDem,
                                    Ten = ten,
                                    Dien = dien,
                                    Giam = (decimal)giam,
                                    DoiTuong = doituong,
                                    MaLopGoc = oLopGoc.MaLopGoc,
                                    GhiChu = ghiChu
                                };
                                #region try to add oSinhVien
                                try
                                {
                                    context.SinhVienDbSet.Add(oSinhVien);
                                    context.SaveChanges();
                                    WriteLog(sw, "+SinhVien+{0}\tTạo record sinh viên {0} {1} {2}",
                                        maSinhVien, hoDem, ten);
                                    row[Col_TrangThai] = ImportStatus.OUT_OK;
                                    nInsertedSinhVien++;
                                }
                                catch (Exception exc)
                                {
                                    string msg = string.Format("\tLỗi khi tạo record sinh viên {0}-{1}: {2}", maSinhVien, hoDem + " " + ten, exc.Message);
                                    WriteLog(sw, msg);
                                    //throw new Exception(msg, exc);
                                    row[Col_TrangThai] = ImportStatus.OUT_ERROR_GENERAL;
                                    continue;
                                }
                                Console.WriteLine(string.Format("- Them moi thong tin sinh vien: {0} - {1} {2}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                   oSinhVien.Ten));
                                WriteLog(sw, string.Format("- Them moi thong tin sinh vien: {0} - {1} {2}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                   oSinhVien.Ten));
                                #endregion

                                #endregion
                            }
                            else
                            {
                                //if (oSinhVien.MaLopGoc != oLopGoc.MaLopGoc)
                                //{
                                //    oSinhVien.MaLopGoc = oLopGoc.MaLopGoc;
                                //    context.SaveChanges();
                                //    Console.WriteLine(string.Format("- Cap nhat ma lop: {0} {1}", oSinhVien.MaSinhVien, oLopGoc.MaLopGoc));
                                //}
                                //continue;
                                if ((oSinhVien.Dien != dien) || (oSinhVien.DoiTuong != doituong) || (oSinhVien.Giam != (decimal)giam) || (oSinhVien.GhiChu != ghiChu))
                                {
                                    oSinhVien.Dien = dien;
                                    oSinhVien.DoiTuong = doituong;
                                    oSinhVien.Giam = (decimal)giam;
                                    oSinhVien.MaLopGoc = oLopGoc.MaLopGoc;
                                    oSinhVien.GhiChu = ghiChu;
                                    context.SaveChanges();
                                    trangThai = ImportStatus.OUT_UPDATED + " sinh viên";
                                    Console.WriteLine(string.Format("- Cap nhat thong tin sinh vien: {0} - {1} {2} {3} {4} {5}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                        oSinhVien.Ten, oSinhVien.Dien, oSinhVien.DoiTuong, oSinhVien.GhiChu));
                                    WriteLog(sw, string.Format("- Cap nhat thong tin sinh vien: {0} - {1} {2} {3} {4} {5}", oSinhVien.MaSinhVien, oSinhVien.HoDem,
                                        oSinhVien.Ten, oSinhVien.Dien, oSinhVien.DoiTuong, oSinhVien.GhiChu));
                                }
                            }
                        }
                        row[Col_TrangThai] = trangThai;
                        #endregion

                        #region Biên chế sinh viên vào học kỳ

                        #region Học phí cả năm
                        double hocPhiCaNam = 0;
                        try
                        {
                            var temp = Convert.ToString(row[Col_HocPhi]);
                            temp = temp.Replace(",", "");
                            hocPhiCaNam = double.Parse(temp);
                        }
                        catch
                        {
                            hocPhiCaNam = 0;
                        }
                        #endregion

                        //if (hocPhiCaNam == 0)
                        //{
                        //    row[Col_TrangThai] = ImportStatus.IN_ERROR_HOCPHI;
                        //    continue;
                        //}

                        #region Lệ phí cả năm
                        double lePhiCaNam = 0;
                        try
                        {
                            var temp = Convert.ToString(row[Col_PhuPhi]);
                            temp = temp.Replace(",", "");
                            lePhiCaNam = double.Parse(temp);
                        }
                        catch
                        {
                            lePhiCaNam = 0;
                        }
                        #endregion

                        List<BienCheSinhVienVaoHocKy> dsBienChe = new List<BienCheSinhVienVaoHocKy>();
                        var dsHK = context.HocKyDbSet.Where(e => e.MaNamHoc == namNopHocPhi.TenNamHoc).OrderBy(e => e.TenHocKy).ToList();
                        if (dsHK != null && dsHK.Count() == 2)
                        {
                            foreach (var hk in dsHK)
                            {
                                var bienChe = context.BienCheSinhVienVaoHocKiDbSet.Where(e => e.MaSinhVien == oSinhVien.MaSinhVien && e.MaHocKy == hk.MaHocKy).FirstOrDefault();
                                if (bienChe != null)
                                {
                                    int hp = (int)hocPhiCaNam / 2;
                                    int lp = (int)lePhiCaNam / 2;
                                    if (bienChe.HocPhi != hp || bienChe.Giam != (decimal)giam)
                                    {
                                        bienChe.HocPhi = hp;
                                        bienChe.LePhi = lp;
                                        bienChe.Giam = (decimal)giam;
                                        context.SaveChanges();
                                    }
                                }
                                else
                                {
                                    bienChe = new BienCheSinhVienVaoHocKy
                                    {
                                        MaBienChe = oSinhVien.MaSinhVien + "." + hk.MaNamHoc + "." + hk.TenHocKy,
                                        MaSinhVien = oSinhVien.MaSinhVien,
                                        MaHocKy = hk.MaHocKy,
                                        HocPhi = (int)hocPhiCaNam / 2,
                                        LePhi = (int)lePhiCaNam / 2,
                                        Giam = (decimal)giam
                                    };
                                    context.BienCheSinhVienVaoHocKiDbSet.Add(bienChe);
                                    context.SaveChanges();
                                }
                                dsBienChe.Add(bienChe);
                            }
                        }
                        else
                        {
                            //throw new Exception("Năm nộp học phí chưa tạo đủ 2 học kỳ");
                        }

                        #endregion

                        #region Lập phiếu thu cho sinh viên
                        //double hocPhiHocKySauKhiMienGiam = hocPhiHocKy - (hocPhiHocKy * giam);
                        #region Nộp lần 1

                        double tongTienDaNop = 0;
                        int sttHK = 1;
                        double nopLan1 = 0;
                        int soPhieuLan1 = 0;
                        DateTime ngayNopLan1 = DateTime.MinValue;
                        double nopLan2 = 0;
                        int soPhieuLan2 = 0;
                        DateTime ngayNopLan2 = DateTime.MinValue;
                        double nopLan3 = 0;
                        int soPhieuLan3 = 0;
                        DateTime ngayNopLan3 = DateTime.MinValue;
                        try
                        {
                            var temp = Convert.ToString(row[Col_NopLan1]);
                            temp = temp.Replace(",", "");
                            nopLan1 = double.Parse(temp);
                        }
                        catch
                        {
                            nopLan1 = 0;
                        }
                        if (nopLan1 != 0)
                        {

                            try
                            {
                                var temp = Convert.ToString(row[Col_SoPhieuLan1]);
                                //temp = temp.Replace(",", "");
                                soPhieuLan1 = int.Parse(temp);
                            }
                            catch
                            {
                                soPhieuLan1 = 0;
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }

                            try
                            {
                                ngayNopLan1 = Convert.ToDateTime(row[Col_NgayNopLan1]);
                            }
                            catch
                            {
                                try
                                {
                                    var temp = Convert.ToString(row[Col_NgayNopLan1]);
                                    if (!string.IsNullOrEmpty(temp))
                                    {
                                        var nt = temp.Split(new char[] { '/', '-' }, StringSplitOptions.RemoveEmptyEntries);
                                        if (nt != null && nt.Count() == 3)
                                        {
                                            ngayNopLan1 = new DateTime(int.Parse(nt[2]), int.Parse(nt[1]), int.Parse(nt[0]));
                                        }
                                    }
                                }
                                catch
                                {
                                    row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                    continue;
                                }

                            }
                            if (ngayNopLan1 == DateTime.MinValue)
                            {
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }

                            string strSoPhieu = soPhieuLan1.ToString();
                            int soQuyen = soPhieuLan1 / soPhieuTrongQuyen + (soPhieuLan1 % soPhieuTrongQuyen == 0 ? 0 : 1);
                            string maBienChe = dsBienChe[sttHK - 1].MaBienChe;
                            PhieuThu phieuThu = context.PhieuThuDbSet.Where(e => e.MaBienChe == maBienChe && e.SoPhieu == strSoPhieu).FirstOrDefault();
                            if (phieuThu == null)
                            {
                                phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = Guid.NewGuid().ToString(),
                                    SoQuyen = (soQuyen).ToString(),
                                    SoPhieu = (soPhieuLan1).ToString(),
                                    NoiDungThu = string.Format("Thu học phí HK {0}/{1}", dsBienChe[sttHK - 1].HocKy.TenHocKy, dsBienChe[sttHK - 1].HocKy.MaNamHoc),
                                    NgayThu = ngayNopLan1,
                                    MaBienChe = maBienChe,
                                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                                    LaHocPhi = true,
                                    SoTien = (int)nopLan1,
                                    DaIn = true
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                context.SaveChanges();
                                Console.WriteLine(string.Format("- Lap phieu thu:  {0}-{1}", phieuThu.NoiDungThu, phieuThu.SoTien));
                            }
                            else
                            {

                            }

                            tongTienDaNop += phieuThu.SoTien;
                        }

                        #endregion

                        #region Nộp lần 2

                        try
                        {
                            var temp = Convert.ToString(row[Col_NopLan2]);
                            temp = temp.Replace(",", "");
                            nopLan2 = double.Parse(temp);
                        }
                        catch
                        {
                            nopLan2 = 0;
                        }
                        if (nopLan2 != 0)
                        {

                            try
                            {
                                var temp = Convert.ToString(row[Col_SoPhieuLan2]);
                                //temp = temp.Replace(",", "");
                                soPhieuLan2 = int.Parse(temp);
                            }
                            catch
                            {
                                //soPhieuLan2 = soPhieuLan1;
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            try
                            {
                                ngayNopLan2 = Convert.ToDateTime(row[Col_NgayNopLan2]);
                            }
                            catch
                            {
                                try
                                {
                                    var temp = Convert.ToString(row[Col_NgayNopLan2]);
                                    if (!string.IsNullOrEmpty(temp))
                                    {
                                        var nt = temp.Split(new char[] { '/', '-' }, StringSplitOptions.RemoveEmptyEntries);
                                        if (nt != null && nt.Count() == 3)
                                        {
                                            ngayNopLan2 = new DateTime(int.Parse(nt[2]), int.Parse(nt[1]), int.Parse(nt[0]));
                                        }
                                        else
                                            ngayNopLan2 = ngayNopLan1;
                                    }
                                    else
                                        ngayNopLan2 = ngayNopLan1;
                                }
                                catch
                                {
                                    //ngayNopLan2 = ngayNopLan1;
                                    row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                    continue;
                                }

                            }
                            if (ngayNopLan2 == DateTime.MinValue)
                            {
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            if (tongTienDaNop >= (hocPhiCaNam / 2))
                                sttHK = 2;
                            sttHK = tongTienDaNop >= hocPhiCaNam ? 1 : sttHK;
                            string strSoPhieu = soPhieuLan2.ToString();
                            string maBienChe = dsBienChe[sttHK - 1].MaBienChe;
                            int soQuyen = soPhieuLan2 / soPhieuTrongQuyen + (soPhieuLan2 % soPhieuTrongQuyen == 0 ? 0 : 1);

                            PhieuThu phieuThu = context.PhieuThuDbSet.Where(e => e.MaBienChe == maBienChe && e.SoPhieu == strSoPhieu).FirstOrDefault();
                            if (phieuThu == null)
                            {
                                phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = Guid.NewGuid().ToString(),
                                    SoQuyen = (soQuyen).ToString(),
                                    SoPhieu = ((int)soPhieuLan2).ToString(),
                                    NoiDungThu = string.Format("Thu {2} HK {0}/{1}", dsBienChe[sttHK - 1].HocKy.TenHocKy, dsBienChe[sttHK - 1].HocKy.MaNamHoc, (tongTienDaNop >= hocPhiCaNam ? "lệ phí" : "học phí")),
                                    NgayThu = ngayNopLan2,
                                    MaBienChe = maBienChe,
                                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                                    LaHocPhi = (tongTienDaNop >= hocPhiCaNam ? false : true),
                                    SoTien = (int)nopLan2,
                                    DaIn = true
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                context.SaveChanges();
                                Console.WriteLine(string.Format("- Lap phieu thu:  {0}-{1}", phieuThu.NoiDungThu, phieuThu.SoTien));
                            }
                            else
                            {
                                //phieuThu.SoQuyen = (soPhieuLan2 / soPhieuTrongQuyen + 1).ToString();
                                //phieuThu.SoPhieu = (soPhieuLan2).ToString();
                                //phieuThu.SoTien = (int)nopLan2;
                            }


                            tongTienDaNop += phieuThu.SoTien;
                        }
                        #endregion

                        #region Nộp lần 3
                        try
                        {
                            var temp = Convert.ToString(row[Col_NopLan3]);
                            temp = temp.Replace(",", "");
                            nopLan3 = double.Parse(temp);
                        }
                        catch
                        {
                            nopLan3 = 0;
                        }
                        if (nopLan3 != 0)
                        {
                            try
                            {
                                var temp = Convert.ToString(row[Col_SoPhieuLan3]);
                                //temp = temp.Replace(",", "");
                                soPhieuLan3 = int.Parse(temp);
                            }
                            catch
                            {
                                //soPhieuLan3 = soPhieuLan2;
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            try
                            {
                                ngayNopLan3 = Convert.ToDateTime(row[Col_NgayNopLan3]);
                            }
                            catch
                            {
                                try
                                {
                                    var temp = Convert.ToString(row[Col_NgayNopLan3]);
                                    if (!string.IsNullOrEmpty(temp))
                                    {
                                        var nt = temp.Split(new char[] { '/', '-' }, StringSplitOptions.RemoveEmptyEntries);
                                        if (nt != null && nt.Count() == 3)
                                        {
                                            ngayNopLan3 = new DateTime(int.Parse(nt[2]), int.Parse(nt[1]), int.Parse(nt[0]));
                                        }
                                        else
                                            ngayNopLan3 = ngayNopLan2;
                                    }
                                    else
                                        ngayNopLan3 = ngayNopLan2;
                                }
                                catch
                                {
                                    //ngayNopLan3 = ngayNopLan2;
                                    row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                    continue;
                                }

                            }
                            if (ngayNopLan3 == DateTime.MinValue)
                            {
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            if (tongTienDaNop >= (hocPhiCaNam / 2))
                                sttHK = 2;
                            sttHK = tongTienDaNop >= hocPhiCaNam ? 1 : sttHK;
                            string strSoPhieu = soPhieuLan3.ToString();
                            string maBienChe = dsBienChe[sttHK - 1].MaBienChe;
                            int soQuyen = soPhieuLan3 / soPhieuTrongQuyen + (soPhieuLan3 % soPhieuTrongQuyen == 0 ? 0 : 1);
                            //var lsPhieuThu = context.PhieuThuDbSet.Where(e => e.BienCheSinhVienVaoHocKy.MaSinhVien == oSinhVien.MaSinhVien && e.SoPhieu == strSoPhieu).ToList();
                            //if (lsPhieuThu != null && lsPhieuThu.Count() > 1)
                            //{
                            //    foreach (var t in lsPhieuThu)
                            //        context.PhieuThuDbSet.Remove(t);
                            //    context.SaveChanges();
                            //}
                            PhieuThu phieuThu = context.PhieuThuDbSet.Where(e => e.MaBienChe == maBienChe && e.SoPhieu == strSoPhieu).FirstOrDefault();
                            if (phieuThu == null)
                            {
                                phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = Guid.NewGuid().ToString(),
                                    SoQuyen = (soQuyen).ToString(),
                                    SoPhieu = (soPhieuLan3).ToString(),
                                    NoiDungThu = string.Format("Thu {2} HK {0}/{1}", dsBienChe[sttHK - 1].HocKy.TenHocKy, dsBienChe[sttHK - 1].HocKy.MaNamHoc, (tongTienDaNop >= hocPhiCaNam ? "lệ phí" : "học phí")),
                                    NgayThu = ngayNopLan3,
                                    MaBienChe = maBienChe,
                                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                                    LaHocPhi = (tongTienDaNop >= hocPhiCaNam ? false : true),
                                    SoTien = (int)nopLan3,
                                    DaIn = true
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                context.SaveChanges();
                                Console.WriteLine(string.Format("- Lap phieu thu:  {0}-{1}", phieuThu.NoiDungThu, phieuThu.SoTien));
                            }
                            else
                            {
                                //phieuThu.SoQuyen = (soPhieuLan3 / soPhieuTrongQuyen + 1).ToString();
                                //phieuThu.SoPhieu = (soPhieuLan3).ToString();
                                //phieuThu.SoTien = (int)nopLan3;
                                //row[Col_TrangThai] = ImportStatus.OUT_UPDATED;
                            }


                            tongTienDaNop += phieuThu.SoTien;
                        }
                        #endregion

                        #endregion

                    }
                }
                catch (Exception exc)
                {
                    throw exc;
                }
                finally
                {
                    if (sw != null)
                        sw.Close();
                }
                return nInsertedSinhVien;
            }
        }

        internal static int NapDuLieuSinhVienV3(NamHoc namNopHocPhi, DataTable dt, string logFilePath = null)
        {
            int nInsertedSinhVien = 0;
            int soPhieuTrongQuyen = 50;
            if (dt.Columns.Contains(Col_ImportThanhCong) == false)
                dt.Columns.Add(Col_ImportThanhCong, typeof(bool));
            using (var context = new QLHPEntities())
            {
                #region System.IO.StreamWriter sr = mở file log nếu được
                System.IO.StreamWriter sw = null;
                if (logFilePath != null)
                    try
                    {
                        sw = new System.IO.StreamWriter(logFilePath);
                    }
                    catch
                    {
                        logFilePath = null;
                    }
                #endregion

                try
                {
                    string st = string.Format("{0} - Nạp dữ liệu sinh viên",
                         DateTime.Now.ToString("dd/MM/yyyy hh:mmLss"));
                    WriteLog(sw, st);
                    WriteLog(sw, StringUtils.TạoChuỗi('-', st.Length));

                    #region 01. Đăng ký thông tin sinh viên
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Console.WriteLine("Dong thu: " + i);
                        DataRow row = dt.Rows[i];
                        var trangThai = Convert.ToString(row[Col_TrangThai]);
                        if (trangThai.Equals(ImportStatus.IN_OK) == false)
                            continue;
                        if (trangThai.Equals(ImportStatus.OUT_OK))
                            continue;

                        trangThai = "";

                        #region Năm tuyển sinh

                        string namTuyenSinh = Convert.ToString(row[Col_NTS]);// maSinhVien.Substring(0, 2);
                        int ntsTemp = 0;
                        if (!int.TryParse(namTuyenSinh, out ntsTemp))
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_NTS;
                            continue;
                        }
                        #endregion

                        #region Hệ đào tạo

                        string heDaoTao = Convert.ToString(row[Col_HDT]);// maSinhVien.Substring(0, 2);
                        if (string.IsNullOrEmpty(heDaoTao))
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_HDT_EMPTY;
                            continue;
                        }
                        var loaiHinh = context.LoaiHinhDaoTaoDbSet.Where(e => e.MaLoaiHinh == heDaoTao).FirstOrDefault();
                        if (loaiHinh == null)
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_HDT_NOTEXIST;
                            continue;
                        }
                        heDaoTao = heDaoTao.Trim();
                        #endregion

                        #region 01. Tạo lớp gốc
                        var tenLopGoc = Convert.ToString(row[Col_Lop]);
                        if (!string.IsNullOrEmpty(tenLopGoc))
                            tenLopGoc = tenLopGoc.Trim();
                        else
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_LOP_EMPTY;
                            Console.WriteLine("- Ten lop rong");
                            continue;
                        }
                        WriteLog(sw, "01. Tạo lớp gốc ", DateTime.Now.ToString("dd/MM/yyyy hh:mmLss"));
                        var oLopGoc = context.LopGocDbSet
                            .Where(e => e.TenLopGoc == tenLopGoc)
                            .FirstOrDefault();
                        if (oLopGoc == null)
                        {
                            continue;
                        }

                        #endregion

                        string maSinhVien = Convert.ToString(row[Col_MaSinhVien]);
                        maSinhVien = maSinhVien.IsNullOrEmpty() ? "" : maSinhVien.Trim();
                        string hoDem = Convert.ToString(row[Col_HoDem]);
                        hoDem = hoDem.Trim();

                        #region string ten;
                        string ten = "";
                        try
                        {
                            ten = Convert.ToString(row[Col_Ten]);
                            ten = ten.Trim();
                        }
                        catch { ten = ""; }
                        #endregion

                        #region string đối tượng;
                        string doituong = "";
                        try
                        {
                            doituong = Convert.ToString(row[Col_DoiTuong]);
                            doituong = doituong.Trim();
                        }
                        catch { doituong = ""; }
                        #endregion

                        #region string dien;
                        string dien = "";
                        try
                        {
                            dien = Convert.ToString(row[Col_Dien]);
                            dien = dien.Trim();
                        }
                        catch
                        {
                            dien = "";
                        }
                        #endregion

                        #region double giảm;
                        double giam = 0;
                        try
                        {
                            giam = Convert.ToDouble(row[Col_Giam]);
                        }
                        catch
                        {
                            giam = 0;
                        }
                        #endregion

                        #region string ghichu;
                        string ghiChu = "";
                        try
                        {
                            ghiChu = Convert.ToString(row[Col_GhiChu]);
                            ghiChu = ghiChu.Trim();
                        }
                        catch { ghiChu = ""; }
                        #endregion

                        #region Nạp sinh viên vào hệ thống
                        string maLopGoc = oLopGoc.MaLopGoc;
                        SinhVien oSinhVien = null;
                        if (string.IsNullOrEmpty(maSinhVien))
                        {
                            oSinhVien = context.SinhVienDbSet.Where(e => e.HoDem == hoDem && e.Ten == ten && e.MaLopGoc == oLopGoc.MaLopGoc).FirstOrDefault();

                        }
                        else
                        {
                            oSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == maSinhVien).FirstOrDefault();
                        }
                        row[Col_TrangThai] = trangThai;
                        #endregion

                        #region Biên chế sinh viên vào học kỳ

                        #region Học phí cả năm
                        double hocPhiCaNam = 0;
                        try
                        {
                            var temp = Convert.ToString(row[Col_HocPhi]);
                            temp = temp.Replace(",", "");
                            hocPhiCaNam = double.Parse(temp);
                        }
                        catch
                        {
                            hocPhiCaNam = 0;
                        }
                        #endregion

                        if (hocPhiCaNam == 0)
                        {
                            row[Col_TrangThai] = ImportStatus.IN_ERROR_HOCPHI;
                            continue;
                        }


                        List<BienCheSinhVienVaoHocKy> dsBienChe = new List<BienCheSinhVienVaoHocKy>();
                        var dsHK = context.HocKyDbSet.Where(e => e.MaNamHoc == namNopHocPhi.TenNamHoc).OrderBy(e => e.TenHocKy).ToList();
                        if (dsHK != null && dsHK.Count() == 2)
                        {
                            foreach (var hk in dsHK)
                            {
                                var bienChe = context.BienCheSinhVienVaoHocKiDbSet.Where(e => e.MaSinhVien == oSinhVien.MaSinhVien && e.MaHocKy == hk.MaHocKy).FirstOrDefault();
                                dsBienChe.Add(bienChe);
                            }
                        }
                        else
                        {
                        }

                        #endregion

                        #region Lập phiếu thu cho sinh viên
                        #region Nộp lần 1

                        double tongTienDaNop = 0;
                        int sttHK = 1;
                        double nopLan1 = 0;
                        int soPhieuLan1 = 0;
                        DateTime ngayNopLan1 = DateTime.MinValue;
                        double nopLan2 = 0;
                        int soPhieuLan2 = 0;
                        DateTime ngayNopLan2 = DateTime.MinValue;
                        double nopLan3 = 0;
                        int soPhieuLan3 = 0;
                        DateTime ngayNopLan3 = DateTime.MinValue;
                        try
                        {
                            var temp = Convert.ToString(row[Col_NopLan1]);
                            temp = temp.Replace(",", "");
                            nopLan1 = double.Parse(temp);
                        }
                        catch
                        {
                            nopLan1 = 0;
                        }
                        if (nopLan1 == 0)
                            continue;
                        else
                        {

                            try
                            {
                                var temp = Convert.ToString(row[Col_SoPhieuLan1]);
                                //temp = temp.Replace(",", "");
                                soPhieuLan1 = int.Parse(temp);
                            }
                            catch
                            {
                                soPhieuLan1 = 0;
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }

                            try
                            {
                                ngayNopLan1 = Convert.ToDateTime(row[Col_NgayNopLan1]);
                            }
                            catch
                            {
                                try
                                {
                                    var temp = Convert.ToString(row[Col_NgayNopLan1]);
                                    if (!string.IsNullOrEmpty(temp))
                                    {
                                        var nt = temp.Split(new char[] { '/', '-' }, StringSplitOptions.RemoveEmptyEntries);
                                        if (nt != null && nt.Count() == 3)
                                        {
                                            ngayNopLan1 = new DateTime(int.Parse(nt[2]), int.Parse(nt[1]), int.Parse(nt[0]));
                                        }
                                    }
                                }
                                catch
                                {
                                    row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                    continue;
                                }

                            }
                            if (ngayNopLan1 == DateTime.MinValue)
                            {
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }

                            string strSoPhieu = soPhieuLan1.ToString();
                            int soQuyen = soPhieuLan1 / soPhieuTrongQuyen + (soPhieuLan1 % soPhieuTrongQuyen == 0 ? 0 : 1);
                            string maBienChe = dsBienChe[sttHK - 1].MaBienChe;
                            var lsPhieuThu = context.PhieuThuDbSet.Where(e => e.BienCheSinhVienVaoHocKy.MaSinhVien == oSinhVien.MaSinhVien && e.SoPhieu == strSoPhieu).ToList();
                            if (lsPhieuThu != null && lsPhieuThu.Count() > 1)
                            {
                                foreach (var t in lsPhieuThu)
                                    context.PhieuThuDbSet.Remove(t);
                                context.SaveChanges();
                            }
                            //double hp = ((int)nopLan1 <= (int)hocPhiHocKySauKhiMienGiam) ? (int)nopLan1 : (int)hocPhiHocKySauKhiMienGiam;
                            PhieuThu phieuThu = context.PhieuThuDbSet.Where(e => e.MaBienChe == maBienChe && e.SoPhieu == strSoPhieu).FirstOrDefault();
                            if (phieuThu == null)
                            {
                                phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = Guid.NewGuid().ToString(),
                                    SoQuyen = (soQuyen).ToString(),
                                    SoPhieu = (soPhieuLan1).ToString(),
                                    NoiDungThu = string.Format("Thu học phí HK {0}/{1}", dsBienChe[sttHK - 1].HocKy.TenHocKy, dsBienChe[sttHK - 1].HocKy.MaNamHoc),
                                    NgayThu = ngayNopLan1,
                                    MaBienChe = maBienChe,
                                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                                    LaHocPhi = true,
                                    SoTien = (int)nopLan1,
                                    DaIn = true
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                Console.WriteLine(string.Format("- Lap phieu thu:  {0}-{1}", phieuThu.NoiDungThu, phieuThu.SoTien));
                            }
                            else
                            {
                                phieuThu.SoQuyen = (soPhieuLan1 / soPhieuTrongQuyen + 1).ToString();
                                phieuThu.SoPhieu = (soPhieuLan1).ToString();
                                phieuThu.SoTien = (int)nopLan1;
                                row[Col_TrangThai] = ImportStatus.OUT_UPDATED;
                            }
                            context.SaveChanges();
                            tongTienDaNop += phieuThu.SoTien;
                        }

                        #endregion

                        #region Nộp lần 2

                        try
                        {
                            var temp = Convert.ToString(row[Col_NopLan2]);
                            temp = temp.Replace(",", "");
                            nopLan2 = double.Parse(temp);
                        }
                        catch
                        {
                            nopLan2 = 0;
                        }
                        if (nopLan2 == 0)
                            continue;
                        else
                        {

                            try
                            {
                                var temp = Convert.ToString(row[Col_SoPhieuLan2]);
                                //temp = temp.Replace(",", "");
                                soPhieuLan2 = int.Parse(temp);
                            }
                            catch
                            {
                                //soPhieuLan2 = soPhieuLan1;
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            try
                            {
                                ngayNopLan2 = Convert.ToDateTime(row[Col_NgayNopLan2]);
                            }
                            catch
                            {
                                try
                                {
                                    var temp = Convert.ToString(row[Col_NgayNopLan2]);
                                    if (!string.IsNullOrEmpty(temp))
                                    {
                                        var nt = temp.Split(new char[] { '/', '-' }, StringSplitOptions.RemoveEmptyEntries);
                                        if (nt != null && nt.Count() == 3)
                                        {
                                            ngayNopLan2 = new DateTime(int.Parse(nt[2]), int.Parse(nt[1]), int.Parse(nt[0]));
                                        }
                                        else
                                            ngayNopLan2 = ngayNopLan1;
                                    }
                                    else
                                        ngayNopLan2 = ngayNopLan1;
                                }
                                catch
                                {
                                    //ngayNopLan2 = ngayNopLan1;
                                    row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                    continue;
                                }

                            }
                            if (ngayNopLan2 == DateTime.MinValue)
                            {
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            if (tongTienDaNop >= (hocPhiCaNam / 2))
                                sttHK = 2;
                            string strSoPhieu = soPhieuLan2.ToString();
                            string maBienChe = dsBienChe[sttHK - 1].MaBienChe;
                            int soQuyen = soPhieuLan2 / soPhieuTrongQuyen + (soPhieuLan2 % soPhieuTrongQuyen == 0 ? 0 : 1);
                            var lsPhieuThu = context.PhieuThuDbSet.Where(e => e.BienCheSinhVienVaoHocKy.MaSinhVien == oSinhVien.MaSinhVien && e.SoPhieu == strSoPhieu).ToList();
                            if (lsPhieuThu != null && lsPhieuThu.Count() > 1)
                            {
                                foreach (var t in lsPhieuThu)
                                    context.PhieuThuDbSet.Remove(t);
                                context.SaveChanges();
                            }
                            PhieuThu phieuThu = context.PhieuThuDbSet.Where(e => e.MaBienChe == maBienChe && e.SoPhieu == strSoPhieu).FirstOrDefault();
                            if (phieuThu == null)
                            {
                                phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = Guid.NewGuid().ToString(),
                                    SoQuyen = (soQuyen).ToString(),
                                    SoPhieu = ((int)soPhieuLan2).ToString(),
                                    NoiDungThu = string.Format("Thu học phí HK {0}/{1}", dsBienChe[sttHK - 1].HocKy.TenHocKy, dsBienChe[sttHK - 1].HocKy.MaNamHoc),
                                    NgayThu = ngayNopLan2,
                                    MaBienChe = maBienChe,
                                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                                    LaHocPhi = true,
                                    SoTien = (int)nopLan2,
                                    DaIn = true
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                Console.WriteLine(string.Format("- Lap phieu thu:  {0}-{1}", phieuThu.NoiDungThu, phieuThu.SoTien));
                            }
                            else
                            {
                                phieuThu.SoQuyen = (soPhieuLan2 / soPhieuTrongQuyen + 1).ToString();
                                phieuThu.SoPhieu = (soPhieuLan2).ToString();
                                phieuThu.SoTien = (int)nopLan2;
                            }

                            context.SaveChanges();
                            tongTienDaNop += phieuThu.SoTien;
                        }
                        #endregion

                        #region Nộp lần 3
                        try
                        {
                            var temp = Convert.ToString(row[Col_NopLan3]);
                            temp = temp.Replace(",", "");
                            nopLan3 = double.Parse(temp);
                        }
                        catch
                        {
                            nopLan3 = 0;
                        }
                        if (nopLan3 == 0)
                            continue;
                        else
                        {
                            try
                            {
                                var temp = Convert.ToString(row[Col_SoPhieuLan3]);
                                //temp = temp.Replace(",", "");
                                soPhieuLan3 = int.Parse(temp);
                            }
                            catch
                            {
                                //soPhieuLan3 = soPhieuLan2;
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            try
                            {
                                ngayNopLan3 = Convert.ToDateTime(row[Col_NgayNopLan3]);
                            }
                            catch
                            {
                                try
                                {
                                    var temp = Convert.ToString(row[Col_NgayNopLan3]);
                                    if (!string.IsNullOrEmpty(temp))
                                    {
                                        var nt = temp.Split(new char[] { '/', '-' }, StringSplitOptions.RemoveEmptyEntries);
                                        if (nt != null && nt.Count() == 3)
                                        {
                                            ngayNopLan3 = new DateTime(int.Parse(nt[2]), int.Parse(nt[1]), int.Parse(nt[0]));
                                        }
                                        else
                                            ngayNopLan3 = ngayNopLan2;
                                    }
                                    else
                                        ngayNopLan3 = ngayNopLan2;
                                }
                                catch
                                {
                                    //ngayNopLan3 = ngayNopLan2;
                                    row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                    continue;
                                }

                            }
                            if (ngayNopLan3 == DateTime.MinValue)
                            {
                                row[Col_TrangThai] = ImportStatus.IN_ERROR_PT;
                                continue;
                            }
                            if (tongTienDaNop >= (hocPhiCaNam / 2))
                                sttHK = 2;

                            string strSoPhieu = soPhieuLan3.ToString();
                            string maBienChe = dsBienChe[sttHK - 1].MaBienChe;
                            int soQuyen = soPhieuLan3 / soPhieuTrongQuyen + (soPhieuLan3 % soPhieuTrongQuyen == 0 ? 0 : 1);
                            var lsPhieuThu = context.PhieuThuDbSet.Where(e => e.BienCheSinhVienVaoHocKy.MaSinhVien == oSinhVien.MaSinhVien && e.SoPhieu == strSoPhieu).ToList();
                            if (lsPhieuThu != null && lsPhieuThu.Count() > 1)
                            {
                                foreach (var t in lsPhieuThu)
                                    context.PhieuThuDbSet.Remove(t);
                                context.SaveChanges();
                            }
                            PhieuThu phieuThu = context.PhieuThuDbSet.Where(e => e.MaBienChe == maBienChe && e.SoPhieu == strSoPhieu).FirstOrDefault();
                            if (phieuThu == null)
                            {
                                phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = Guid.NewGuid().ToString(),
                                    SoQuyen = (soQuyen).ToString(),
                                    SoPhieu = (soPhieuLan3).ToString(),
                                    NoiDungThu = string.Format("Thu học phí HK {0}/{1}", dsBienChe[sttHK - 1].HocKy.TenHocKy, dsBienChe[sttHK - 1].HocKy.MaNamHoc),
                                    NgayThu = ngayNopLan3,
                                    MaBienChe = maBienChe,
                                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                                    LaHocPhi = true,
                                    SoTien = (int)nopLan3,
                                    DaIn = true
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                Console.WriteLine(string.Format("- Lap phieu thu:  {0}-{1}", phieuThu.NoiDungThu, phieuThu.SoTien));
                            }
                            else
                            {
                                phieuThu.SoQuyen = (soPhieuLan3 / soPhieuTrongQuyen + 1).ToString();
                                phieuThu.SoPhieu = (soPhieuLan3).ToString();
                                phieuThu.SoTien = (int)nopLan3;
                                row[Col_TrangThai] = ImportStatus.OUT_UPDATED;
                            }

                            context.SaveChanges();
                            tongTienDaNop += phieuThu.SoTien;
                        }
                        #endregion

                        #endregion

                    #endregion
                    }
                }
                catch (Exception exc)
                {
                    throw exc;
                }
                finally
                {
                    if (sw != null)
                        sw.Close();
                }
                return nInsertedSinhVien;
            }
        }


        internal static string UndoNapDuLieuSinhVien(string logfile)
        {
            System.IO.StreamReader sr = null;
            using (var context = new QLHPEntities())
            {
                try
                {
                    #region Đọc và phân tích các task
                    sr = new System.IO.StreamReader(logfile);
                    List<string> lstTask = new List<string>();
                    while (true)
                    {
                        string line = sr.ReadLine();
                        if (line == null)
                            break;
                        if (line.StartsWith("+") == false)
                            continue;
                        int idxTab = line.IndexOf("\t");
                        if (idxTab <= 0)
                            continue;
                        line = line.Substring(1, idxTab - 1);
                        if (line.Length > 0)
                            lstTask.Add(line);
                    }
                    #endregion

                    #region Thực hiện undo các task
                    List<string> lstUndo = new List<string>();
                    int nUndo_OK = 0;
                    for (int i = lstTask.Count - 1; i >= 0; i--)
                    {
                        string task = lstTask[i];
                        string[] param = task.Split('+');
                        if (param.Length == 0)
                            continue;
                        string stCommand = "";
                        if (param[0] == "LopGoc")
                        {
                            #region Xoá lớp gốc
                            stCommand = string.Format("delete from LopGoc where MaLop='{0}'", param[1]);
                            #endregion
                        }
                        else if (param[0] == "SinhVien")
                        {
                            #region Xoá sinh viên
                            stCommand = string.Format("delete from SinhVien where MaSinhVien='{0}'", param[1]);
                            #endregion
                        }
                        try
                        {
                            int nEffected = context.Database.ExecuteSqlCommand(stCommand);
                            if (nEffected > 0)
                            {
                                lstUndo.Add(string.Format("-{0}", task));
                                nUndo_OK++;
                            }
                            else
                                lstUndo.Add(string.Format("~{0}", task));
                        }
                        catch (Exception exc)
                        {
                            lstUndo.Add(string.Format("!{0}!{1}!{2}", task, stCommand, exc.Message));
                        }
                    }
                    #endregion

                    #region Ghi file undo task
                    var undoFileName = string.Format("{0}@{1}.undo",
                        System.IO.Path.GetFileNameWithoutExtension(logfile),
                        DateTime.Now.ToString("yyyyMMdd-HHmm"));
                    var undoDir = new System.IO.FileInfo(logfile).Directory.FullName;
                    var undoFullFilePath = System.IO.Path.Combine(undoDir, undoFileName);
                    var sw = new System.IO.StreamWriter(undoFullFilePath);
                    for (int i = lstUndo.Count - 1; i >= 0; i--)
                        sw.WriteLine(lstUndo[i]);
                    sw.Close();
                    return string.Format(
                        "Khôi phục được {0}/{1} thao tác!\n" +
                        "Xem chi tiết tại file {2}", nUndo_OK, lstTask.Count, undoFileName);
                    #endregion
                }
                catch (Exception exc)
                {
                    return "Lỗi " + exc.Message;
                }
                finally
                {
                    if (sr != null)
                        sr.Close();
                }
            }
        }

        internal static List<SinhVien> GetListSinhVien(string maLop)
        {
            using (var context = new QLHPEntities())
            {
                return context.SinhVienDbSet.Where(e => e.MaLopGoc == maLop).ToList();
            }
        }

        internal static void AddSinhVien(SinhVien sv)
        {
            using (var context = new QLHPEntities())
            {
                var oSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == sv.MaSinhVien).FirstOrDefault();
                if (oSinhVien != null)
                    throw new Exception(string.Format("Đã tồn tại sinh viên [{0}] {1} trên hệ thống",
                        oSinhVien.MaSinhVien, oSinhVien.HoDem + " " + oSinhVien.Ten));
                context.SinhVienDbSet.Add(sv);
                context.SaveChanges();
            }
        }

        internal static void UpdateSinhVien(SinhVien sv)
        {
            using (var context = new QLHPEntities())
            {
                var oSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == sv.MaSinhVien).FirstOrDefault();
                if (oSinhVien == null)
                    throw new Exception("Sinh viên cần cập nhật không còn tồn tại trên hệ thống");
                oSinhVien.HoDem = sv.HoDem;
                oSinhVien.Ten = sv.Ten;
                oSinhVien.GioiTinh = sv.GioiTinh;
                oSinhVien.NgaySinh = sv.NgaySinh;
                oSinhVien.MaLopGoc = sv.MaLopGoc;
                oSinhVien.Giam = sv.Giam;
                oSinhVien.Dien = sv.Dien;
                oSinhVien.GhiChu = sv.GhiChu;
                context.SaveChanges();
            }
        }

        internal static void DeleteSinhVien(SinhVien sv)
        {
            using (var context = new QLHPEntities())
            {
                var oSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == sv.MaSinhVien).FirstOrDefault();
                if (oSinhVien == null)
                    throw new Exception("Sinh viên cần xoá không còn tồn tại trên hệ thống");
                context.SinhVienDbSet.Remove(oSinhVien);
                context.SaveChanges();
            }
        }

        public static string GenerateIDHocVien(QLHPEntities db, int namTS, string maNganh, int defaultSTT = 1)
        {
            string maHocVien = string.Format("{0:00}.{1}", namTS % 100, maNganh);
            var hv = db.SinhVienDbSet
                .Where(e => e.MaSinhVien.Contains(maHocVien))
                .OrderByDescending(e => e.MaSinhVien).FirstOrDefault();
            if (hv == null)
                return string.Format("{0}.{1:0000000}", maHocVien, defaultSTT);
            var strs = hv.MaSinhVien.Split(new char[] { '.' });
            if (strs != null && strs.Count() == 3)
            {
                var stt = int.Parse(strs[2]);
                return string.Format("{0}.{1:0000000}", maHocVien, stt + 1);
            }
            else
                return string.Format("{0}.{1:0000000}", maHocVien, defaultSTT);
        }
    }
}
